/* 
 * File:   Observable.h
 * Author: Gab'z
 *
 * Created on 31 mai 2012, 19:21
 */

#ifndef OBSERVABLE_H
#define	OBSERVABLE_H

#include <list>
#include "Observer.h"

namespace calculator {

    /**
     * Desgin Pattern Observer.
     */
    class Observable {
    public:

        /**
         * Ajoute un observateur à cet objet.
         * @param observer un objet héritant de Observer
         */
        void addObserver(Observer* observer) {
            observerList.push_front(observer);
        }

        /**
         * Retire un observateur de cet objet.
         * @param o l'observateur à retirer.
         */
        void removeObserver(Observer* observer) {
            observerList.remove(observer);
        }

        /**
         * Destructeur de Observable.
         */
        virtual ~Observable() {
            for (std::list<Observer*>::iterator it = observerList.begin();
                    it != observerList.end();
                    it++) {
                observerList.remove(*it);
            }
        }

    protected:

        /**
         * Constructeur de Observable.
         */
        Observable() {
        }

        /**
         * Informe les observateurs que l'objet qu'ils observent a changé.
         */
        void notify() {
            for (std::list<Observer*>::iterator it = observerList.begin();
                    it != observerList.end();
                    it++) {
                (*it)->updateObserver();
            }
        }

    private:
        
        /**
         * Liste d'observateurs pour un objet Observable
         */
        std::list<Observer*> observerList;
    };
}
#endif	/* OBSERVABLE_H */

